package com.leetcode.demo3Solution.java;

import java.util.*;

/*无重复字符的最长子串*/
class Solution {
    public static void main(String[] args) {
        System.out.println( lengthOfLongestSubstring("abcb") );

    }

    public static int lengthOfLongestSubstring(String s) {
        /*ArrayList<Character> alist=new ArrayList<Character>();
        Map<Integer,Integer> map=new HashMap<Integer, Integer>();
        Random random=new Random();
        int max=0;
        for(int i=0;i<s.length();i++){
            if(alist.contains(s.charAt(i))){
                if(alist.get(alist.size()-1)==s.charAt(i) ){                                //  pw wk  字符与最后一位数相同
                    map.put(random.nextInt(),alist.size());
                    alist.clear();
                }else if(alist.get(0)==s.charAt(i)){
                    map.put(random.nextInt(),(alist.size()-alist.indexOf(s.charAt(i))));                  //abcd abcde  字符与第一位数相同
                    alist.remove(0);
                }
                else {                                                           //  adve df        字符与第一位数或者前一段中的中间位置相同
                    map.put(random.nextInt(),alist.size());
                    map.put(random.nextInt(),(alist.size()-alist.indexOf(s.charAt(i))));
                    int num=alist.indexOf(s.charAt(i));
                        for(int j=0;j<=num;j++){
                        alist.remove(0);
                    }
                }
            }
            alist.add(s.charAt(i));
        }
        map.put(random.nextInt(),alist.size());
        // alist.clear();
        for (int v : map.values()) {
            System.out.println("桃子大帅比："+v);
            if(v>max){
                max=v;
            }
        }
        // Collections.sort(alist);
        return max;*/
        int n = s.length(), ans = 0;
        Map<Character, Integer> map = new HashMap<>();
        for (int end = 0, start = 0; end < n; end++) {
            char alpha = s.charAt(end);
            if (map.containsKey(alpha)) {
                start = Math.max(map.get(alpha), start);
            }
            ans = Math.max(ans, end - start + 1);
            map.put(s.charAt(end), end + 1);
        }
        return ans;

    }}